Spring funciones consultas avanzadas

Descripcion

Documentar los metodos de consultas que se pueden utilizar para hacer consultas desde el repositorio JPA para dar mas funcionalidad a la hora de usar el repositorio.

Ejemplo de funcion en el repostiorio:

public interface Repositorio extends CrudRepository<Persona, Integer> {
    List<Persona> findAll();
 }
Documentacion de referencia
Spring JPA reference



Ordenar resultado de consultas

OrderBy

Podemos usar la combinacion de palabras OrderBy para organizar el resultado de una consulta de la siguiente manera:

List<Persona> findAllByOrderByNameAsc();

De esta manera obtendriamos todos los resultados del repositorio ordenados por name de manera ascendente.

Hay que tener en cuenta un problema que tiene el OrderBy y es que es CaseSensitive lo que quiere decir que si hay palabras con mayusculas las ordenará antes de cualquiera palabra con minusculas, por lo tanto el orden no seria un orden alfabetico como tal, primero irian todas las palabras con mayusculas en orden alfabetico y despues todas las palabras con minusculas en orden alfabetico.

Si queremos ordenar por orden inverso usariamos Desc en vez de Asc

Sort

Ya que con OrderBy tenemos la limitacion del CaseSensitive podemos usar Sort de la siguiente manera:

En el repositorio iria un codigo como este:

List<Persona> findAll(Sort sort);

Y despues llamamos a la funcion tal que asi:

repositorio.findAll(Sort.by(Sort.Order.asc("name").ignoreCase()));

En este campo estariamos ordenando de manera ascendente por el campo name

De esta manera los resultados quedan ordenados independientemente de si las letras esten en mayusculas o minusculas

Busqueda por atributos dentro de un objeto (Traversed path)

Cuando tenemos un repositorio de una entidad que tiene objetos dentro podemos utilizar la siguiente funcion para filtrar por objetos dentro del objeto:

findByMember_id(id)

Utilizamos la barra baja _ para indicar un atributo dentro de un objeto

De esta manera buscariamos por el campo id dentro del objeto member que estaría dentro del objeto asociado al repositorio en el que estamos haciendo la consulta

Busqueda por atributos dentro de un objeto y ordenar por atributo dentro de objeto

Si queremos tambien podemos hacer una busqueda como la anterior y a su vez ordenar por un criterio que sea el de un campo dentro de un objeto:

findByMember_idOrderBySkill_skillDesc(id)

En este caso estaríamos buscando por el campo id dentro del objeto member y a su vez estariamos ordenando los resultados por el campo skill dentro del objeto skill

Busqueda en multiples campos

Si quisiesemos realizar una busqueda por multiples campos podemos hacerlo de la siguiente manera:

findByNameAndLocation(String name, String location)

Utilizamos la palabra And para enlazar dos atributos

En este caso estariamos filtrando tanto por name como por location al mismo tiempo

Busqueda por conjunto de datos

Si queremos buscar por un conjunto de datos en una lista podemos hacerlo de la siguiente manera:

findByInventoryIdIn(List<Long> inventoryIdList)

Se utiliza la palabra In para realizar la busqueda en un conjunto

De esta manera buscariamos por por los InventoryId que coincidiesen con todos los ids en la lista invetoryIdList.

Tags

Spring | Repository | JPA | Consultas